package chixing.day05;

import java.util.Arrays;

public class MyContainer {
    private int[] array = null;
    private final int DEFAULE_CAPACITY = 10;//默认容器长度

    //容器中已有元素的个数
    private int size = 0;

    //默认容器长度为10
    public MyContainer(){
        array = new int[DEFAULE_CAPACITY];
    }
    //用户自定义容器长度
    public MyContainer(int length) {
        array = new int[length];
    }

    /**
     * 在容器中添加新元素，
     * 默认添加在容器的尾部，若超过了容器的最大容量，则扩容到原来的2n+1
     * @param ele 要添加的元素
     * @return 返回添加成功
     */
//    public boolean add(int ele){
//        //没超过数组最大容量就直接把元素添加到数组中，否则就对容器进行扩容
//        if (size < array.length){
//            array[size] = ele;
//        }else {
//           int[] newArray = new int[(array.length << 1) + 1];
//           //扩容完把旧的数组中的数复制到新数组中
//            for (int i = 0;i < array.length;i++){
//                newArray[i] = array[i];
//            }
//
//            //把新数组的地址值给旧的数组
//            array = newArray;
//            //复制完成，把要加入的元素加入到新数组中
//            array[size] = ele;
//        }
//        size++;
//        return true;
//    }
    public boolean add(int ele){
        //先判断需要扩容的扩容玩在插入，如果不需要扩容则直接插入
        if (size >= array.length)
           array = Arrays.copyOf(array,(array.length << 1) + 1);
        array[size++] = ele;
        return true;
    }

    /**
     * 将元素添加在指定位置
     * @param ele 要添加的元素
     * @param index 要添加元素的位置
     * @return 返回添加成功
     * 插入的下标只能是 0<=index<size+1
     */
//    public boolean add(int ele,int index){
//        //index小于数组长度并且数组中还有容量，的时候就可以直接插入了，否则要先扩容再插入
//        if (index < array.length && size < array.length){
//            backMove(ele,index);
//        }else {
//            int[] newArray = new int[(array.length << 1) + 1];
//            //扩容完把旧的数组中的数复制到新数组中
//            for (int i = 0;i < array.length;i++){
//                newArray[i] = array[i];
//            }
//            //把新数组的地址值给旧的数组
//            array = newArray;
//            backMove(ele,index);
//        }
//        return true;
//    }
    public boolean add(int ele,int index){
        if (index < 0 || index > size){
            return false;
        }
        //判断需不需要扩容
        if (size >= array.length ){//需要扩容
            int[] newArray = new int[(array.length << 1) + 1];
            //将原数组一分为二复制到新数组中
            System.arraycopy(array,0,newArray,0,index);
            System.arraycopy(array,index ,newArray,index + 1,size-index);
            array = newArray;
        }else {//不需要扩容
            System.arraycopy(array,index,array,index+1,size-index);
        }
        array[index] = ele;
        size++;
        return true;
    }

    /**
     * 删除指定位置的元素
     * 删除指定位置的元素后，后面的元素要依次往前挪
     * @param index 要删除位置的下标，下标从0开始
     * @return 返回删除成功
     */
    public boolean remove(int index){
        //把要删除的元素改为0，后面size--
        array[index] = 0;
        //被删除后的元素往前移
        for (int i = index;i < array.length - 1 ;i++){
            array[i] = array[i + 1];
        }
        size--;
        return true;
    }


    //获得元素中已有元素的个数
    public int size(){
        return size;
    }

    //打印容器中已有元素
    public void print(){
        for (int i = 0;i < size;i++){
            System.out.print(array[i] + ",");
        }
        System.out.println();
    }



    public int[] getArray() {
        return array;
    }

    public void setArray(int[] array) {
        this.array = array;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    @Override
    public String toString() {
        return "MyContainer{" +
                "array=" + Arrays.toString(array) +
                ", size=" + size +
                '}';
    }
}
